home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Science / µSim 1.0b5 folder / Libs / CursorBalloon.c < prev    next >
Encoding:
Text File  |  1994-09-17  |  5.1 KB  |  182 lines  |  [TEXT/MMCC]

  1. /*
  2. Copyright © 1993,1994 by Fabrizio Oddone
  3. ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
  4. This source code is distributed as freeware: you can copy, exchange, modify this
  5. code as you wish. You may include this code in any kind of application: freeware,
  6. shareware, or commercial, provided that full credits are given.
  7. You may not sell or distribute this code for profit.
  8. */
  9.  
  10. //#pragma load "MacDump"
  11.  
  12. #include    "CursorBalloon.h"
  13.  
  14. static void myShowBalloon(RgnHandle theGlobalCoordsRgn,
  15.                             unsigned long theBalloon,
  16.                             short variant);
  17.  
  18. /* globals for the manager */
  19.  
  20. RgnHandle    mouseRgn, wideOpenRgn;
  21.  
  22. /*
  23. The window will "remember" an object; you pass the following characteristics:
  24. •    the region enclosing the object, in local coordinates;
  25. •    the procedure recalculating the object region (in local coordinates);
  26.     this will be called automatically whenever the window size changes;
  27.     if the object will never be resized, pass nil;
  28.     Here is the prototype for the recalcProc:
  29. void RecalcIO(WindowPtr w, RgnBalloonCursPtr theObj);
  30. •    the cursor (B&W) associated with this object;
  31.     if you want the standard arrow cursor, pass nil;
  32. •    the balloon that will appear when Balloon Help is on;
  33.     use this macro: toBalloon(ID_of_STR#_resource, index );
  34.     if you do not want a balloon, pass 0L;
  35. •    the variant of the balloon (see Inside Macintosh for the meaning of this)
  36.     if you do not want a balloon, pass 0;
  37. */
  38.  
  39. OSErr InstallRgnHandler(FabWindowPtr w, RgnHandle whichRgn, void (*recalcProc)(FabWindowPtr, RgnBalloonCursPtr),
  40.                         CursHandle cursor,
  41.                         unsigned long balloon, short ballnVariant)
  42. {
  43. RgnBalloonCurs    t;
  44. register OSErr err = appMemFullErr;
  45.  
  46. t.recalcRgnProc = recalcProc;
  47. t.zoneLocal = whichRgn;
  48. t.curs = cursor;
  49. t.myBalloon = balloon;
  50. t.balloonVariant = ballnVariant;
  51. t.zoneGlobal = NewRgn();
  52. if (t.zoneGlobal) {
  53.     CopyRgn(whichRgn, t.zoneGlobal);
  54.     OffsetRgn(t.zoneGlobal, -(((WindowPtr)w)->portBits.bounds.left), -(((WindowPtr)w)->portBits.bounds.top));
  55.     
  56.     if ((err = PtrAndHand(&t, (Handle)Zones(w), sizeof(RgnBalloonCurs))) == noErr)
  57.         OneMoreObject(w);
  58.     }
  59. return err;
  60. }
  61.  
  62. /* Recalculate the mouse region; you pass:
  63. •    a WindowPtr (not necessarily a FabWindowPtr);
  64. •    the mouse position (in global coordinates);
  65. */
  66.  
  67. void RecalcMouseRegion(WindowPtr w, Point mouse)
  68. {
  69. register RgnBalloonCursPtr    curObj;
  70. register unsigned long    i;
  71.  
  72. if ((IsFabWindow(w)) && (NumObjects(w))) {
  73.     CopyRgn(wideOpenRgn, mouseRgn);
  74.     HLockHi((Handle)Zones(w));
  75.     for (i = 1, curObj = *Zones(w); i <= NumObjects(w); i++, curObj++) {
  76.         if (PtInRgn(mouse, curObj->zoneGlobal)) {
  77.             if (curObj->curs)
  78.                 SetCursor(*curObj->curs);
  79.             else
  80.                 SetCursor(&qd.arrow);
  81.             if (curObj->myBalloon)
  82.                 if (HMGetBalloons())
  83.                     myShowBalloon(curObj->zoneGlobal, curObj->myBalloon,
  84.                                     curObj->balloonVariant);
  85.             CopyRgn(curObj->zoneGlobal, mouseRgn);
  86.             break;
  87.             }
  88.         else
  89.             DiffRgn(mouseRgn, curObj->zoneGlobal, mouseRgn);
  90.         }
  91.     if (i > NumObjects(w))
  92.         SetCursor(&qd.arrow);
  93.     HUnlock((Handle)Zones(w));
  94.     }
  95. else {
  96.     CopyRgn(wideOpenRgn, mouseRgn);
  97.     SetCursor(&qd.arrow);
  98.     }
  99. }
  100.  
  101. /* Resizes the dynamic objects of the window by calling the recalcProc
  102. for every object */
  103.  
  104. void ResizeObjects(FabWindowPtr w)
  105. {
  106. register void (*theProc)(FabWindowPtr, RgnBalloonCursPtr);
  107. register RgnBalloonCursPtr    curObj;
  108. register unsigned long    i;
  109.  
  110. if (NumObjects(w)) {
  111.     HLockHi((Handle)Zones(w));
  112.     for (i = 1, curObj = *Zones(w); i <= NumObjects(w); i++, curObj++) {
  113.         theProc = curObj->recalcRgnProc;
  114.         if (theProc)
  115.             theProc(w, curObj);
  116.         }
  117.     HUnlock((Handle)Zones(w));
  118.     }
  119. }
  120.  
  121. /* Calculates the regions for the given FabWindow in global coordinates,
  122. so that they are ready for WaitNextEvent
  123. */
  124.  
  125. void RecalcGlobalCoords(FabWindowPtr w)
  126. {
  127. register RgnBalloonCursPtr    curObj;
  128. register unsigned long    i;
  129.  
  130. if (NumObjects(w)) {
  131.     HLockHi((Handle)Zones(w));
  132.     for (i = 1, curObj = *Zones(w); i <= NumObjects(w); i++, curObj++) {
  133.         CopyRgn(curObj->zoneLocal, curObj->zoneGlobal);
  134.         OffsetRgn(curObj->zoneGlobal, -(((WindowPtr)w)->portBits.bounds.left), -(((WindowPtr)w)->portBits.bounds.top));
  135.         }
  136.     HUnlock((Handle)Zones(w));
  137.     }
  138. }
  139.  
  140. /* myShowBalloon: common routine for showing up balloons */
  141.  
  142. static void myShowBalloon(RgnHandle theGlobalCoordsRgn,
  143.                             unsigned long theBalloon, short variant)
  144. {
  145. HMMessageRecord    helpMsg;
  146. Point    myTip;
  147.  
  148. myTip.v = (*theGlobalCoordsRgn)->rgnBBox.top + 3;
  149. myTip.h = (*theGlobalCoordsRgn)->rgnBBox.right - 3;
  150. helpMsg.hmmHelpType = khmmStringRes;
  151. *(unsigned long *)&helpMsg.u.hmmStringRes.hmmResID = theBalloon;
  152. //helpMsg.u.hmmStringRes.hmmIndex = *(((short *)(&theBalloon)) +1);
  153. if (hmBalloonAborted == HMShowBalloon(&helpMsg, myTip, &(*theGlobalCoordsRgn)->rgnBBox,
  154.                                         nil, 0, variant, kHMRegularWindow))
  155.     ForceMouseMovedEvent();
  156. }
  157.  
  158. void DisposFabWindow(FabWindowPtr w)
  159. {
  160. register RgnBalloonCursHandle    tempH;
  161. register RgnBalloonCursPtr    spanPtr;
  162. register unsigned long    i;
  163.  
  164. tempH = Zones(w);
  165. HLock((Handle)tempH);
  166. spanPtr = *tempH;
  167.  
  168. for (i = 0; i < NumObjects(w); i++, spanPtr++) {
  169.     DisposeRgn(spanPtr->zoneLocal);
  170.     DisposeRgn(spanPtr->zoneGlobal);
  171. /* we do nothing with the CursHandles since they might be system cursors */
  172.     }
  173. DisposHandle((Handle)tempH);
  174. CloseWindow((WindowPtr)w);
  175. }
  176.  
  177. void ForceMouseMovedEvent(void)
  178. {
  179. SetRectRgn(mouseRgn, 32761, 32761, 32765, 32765);
  180. }
  181.  
  182.